home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smb_sid2user.nasl < prev    next >
Text File  |  2005-01-14  |  15KB  |  586 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7.  
  8. if(description)
  9. {
  10.  script_id(10399);
  11.  script_bugtraq_id(959);
  12. script_cve_id("CVE-2000-1200");
  13.  script_version ("$Revision: 1.46 $");
  14.  
  15.  name["english"] = "SMB use domain SID to enumerate users";
  16.  name["francais"] = "Usage du SID du domaine pour obtenir les noms d'utilisateurs";
  17.  
  18.  script_name(english:name["english"],
  19.           francais:name["francais"]);
  20.  
  21.  desc["english"] = "
  22.  
  23. This script uses the Domain SID to enumerates
  24. the users ID from 1000 to 1200 (or whatever you
  25. set this to, in the preferences)
  26.  
  27. Risk factor : Medium";
  28.  
  29.  desc["francais"] = "
  30.  
  31. Ce script utilise le SID du domaine pour Θnumerer
  32. les utilisateurs d'id 1000 α 1200 (ou quoi que vous mettiez,
  33. dans les preferences)";
  34.  
  35.  script_description(english:desc["english"],
  36.              francais:desc["francais"]);
  37.  
  38.  summary["english"] = "Enumerates users";
  39.  summary["francais"] = "Enumeration des utilisateurs";
  40.  script_summary(english:summary["english"],
  41.          francais:summary["francais"]);
  42.  
  43.  script_category(ACT_GATHER_INFO);
  44.  
  45.  script_copyright(english:"This script is Copyright (C) 2000, 2001 Renaud Deraison");
  46.  family["english"] = "Windows";
  47.  script_family(english:family["english"]);
  48.  
  49.  script_dependencies("netbios_name_get.nasl",
  50.               "smb_login.nasl",
  51.              "smb_dom2sid.nasl");
  52.  script_require_keys("SMB/transport", "SMB/name", "SMB/login", "SMB/password", "SMB/domain_sid");
  53.  script_require_ports(139, 445);
  54.  script_add_preference(name:"Start UID : ", type:"entry", value:"1000");
  55.  script_add_preference(name:"End UID : ", type:"entry", value:"1200");
  56.  
  57.  exit(0);
  58. }
  59.  
  60. include("smb_nt.inc");
  61. port = kb_smb_transport();
  62. if(!port)port = 139;
  63. if(!get_port_state(port))exit(0);
  64. __start_uid = script_get_preference("Start UID : ");
  65. __end_uid   = script_get_preference("End UID : ");
  66.  
  67. if(__end_uid < __start_uid)
  68. {
  69.  t  = __end_uid;
  70.  __end_uid = __start_uid;
  71.  __start_uid = t;
  72. }
  73.  
  74. if(!__start_uid)__start_uid = 1000;
  75. if(!__end_uid)__end_uid = __start_uid + 1000;
  76.  
  77. # Let's go.
  78. #
  79. # This code is long and somehow complex
  80. #
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. #==================================================================#
  89. # Section 1. Utilities                                             #
  90. #==================================================================#
  91.  
  92.  
  93.  
  94. #-------------------------------------------------------------#
  95. # return a 28 + strlen(data) + (odd(data)?0:1) long string    #
  96. #-------------------------------------------------------------#
  97. function lsa_unicode(data)
  98. {
  99.  len = strlen(data);
  100.  ret = raw_string(ord(data[0]));
  101.  
  102.  for(i=1;i<len;i=i+1)
  103.  {
  104.   ret = ret + raw_string(0, ord(data[i]));
  105.  }
  106.  
  107.  
  108.  if(!(len & 1)){even = 1;}
  109.  else even = 0;
  110.  
  111.  
  112.  if(even)
  113.   {
  114.   ret = ret + raw_string(0,0,0,0xC9, 0x11, 0x18);
  115.   }
  116.  else
  117.   ret = ret + raw_string(0,0,0,0x18);
  118.  
  119.  for(i=0;i<19;i=i+1)
  120.   ret = ret + raw_string(0);
  121.   
  122.  return(ret);
  123. }
  124.  
  125.  
  126.  
  127. #-------------------------------------------------------------#
  128. # convert a 4 bytes value to a long               #
  129. #-------------------------------------------------------------#            
  130. function long(s, index)
  131. {
  132.  num = ord(s[index+3]);
  133.  a = num*256;
  134.  num = ord(s[index+2]);
  135.  num = num + a;
  136.  a = num*256;
  137.  num = ord(s[index+1]);
  138.  num = num+a;
  139.  a = num*256;
  140.  num = ord(s[index]);
  141.  num = num+a;
  142.  return(num);
  143. }
  144.  
  145. #---------------------------------------------------------#
  146. # hexstr() to raw_string() conversion              #
  147. #---------------------------------------------------------#
  148.  
  149. function hexsid_to_rawsid(s)
  150. {
  151.  local_var i, j, ret;
  152.  
  153.  for(i=0;i<strlen(s);i+=2)
  154.  {
  155.   if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9"))
  156.       j = int(s[i]);
  157.   else
  158.       j = int((ord(s[i]) - ord("a")) + 10);
  159.  
  160.   j *= 16;
  161.   if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9"))
  162.       j += int(s[i+1]);
  163.   else
  164.       j += int((ord(s[i+1]) - ord("a")) + 10);
  165.   ret += raw_string(j);
  166.  }
  167.  return ret;
  168. }
  169.  
  170. #---------------------------------------------------------#
  171. # Decode the username we got                              #
  172. #---------------------------------------------------------#
  173. function decode_username(s)
  174. {
  175.  data_offset = ord(s[52]) * 256;
  176.  data_offset = data_offset + ord(s[51]);
  177.  
  178.  pad = ord(s[59]);
  179.  
  180.  
  181.  index = data_offset + 4; 
  182.  mac_len = ord(s[125]);
  183.  mac_len = mac_len * 256;
  184.  mac_len = mac_len + ord(s[124]);
  185.  
  186.  index = index + mac_len + mac_len + 2 + 130;
  187.  
  188.  odd = mac_len & 1;
  189.  
  190.  if(odd)index = index + 2;
  191.  
  192.  name_len = ord(s[index+1]);
  193.  name_len = name_len * 256;
  194.  
  195.  name_len = name_len + ord(s[index]);
  196.  
  197.  name_len = name_len * 2;
  198.  if(!name_len)return(FALSE);
  199.  name = "";
  200.  index = index+4;
  201.  for(i=0;i<name_len;i=i+2)
  202.  {
  203.   name = string(name,raw_string(ord(s[index+i])));
  204.  }
  205.  return(name);
  206. }            
  207.  
  208.  
  209. #---------------------------------------------------------#
  210. # Do something that we need for the rest                  #
  211. #---------------------------------------------------------#
  212.         
  213. function pipe_request_lsa_open_policy_setup(soc, uid, tid, pipe)
  214. {
  215.  tid_low = tid % 256;
  216.  tid_high = tid / 256;
  217.  uid_low = uid % 256;
  218.  uid_high = uid / 256;
  219.  pipe_low = pipe % 256;
  220.  pipe_high = pipe / 256;
  221.  
  222.  req = raw_string(0x00, 0x00,
  223.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  224.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  225.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  226.           0x00, 0x06, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  227.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  228.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  229.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  230.           0x00, 0x48, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  231.           0x00, pipe_low, pipe_high, 0x51, 0x00, 0x5C, 0x50, 0x49,
  232.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  233.           0x0B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  234.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16,
  235.           0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  236.           0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x57,
  237.           0x34, 0x12, 0x34, 0x12, 0xCD, 0xAB, 0xEF, 0x00,
  238.           0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0x00, 0x00,
  239.           0x00, 0x00, 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C,
  240.           0xc9, 0x11, 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10,
  241.           0x48, 0x60, 0x02, 0x00, 0x00, 0x00);      
  242.  send(socket:soc, data:req);
  243.  r = smb_recv(socket:soc, length:4096);
  244.  if(strlen(r) < 10 )return(FALSE);
  245.  if(ord(r[9])==0)return(r);
  246.  else return(FALSE);
  247. }
  248.  
  249.  
  250. #-----------------------------------------------------------------#
  251. # First step : we do _some_ request and we are returned a magic   #
  252. # number that we will use in step 2                               #
  253. #                                                                 #
  254. # (things are starting to get complicated)                        #
  255. #                                                                 # 
  256. #-----------------------------------------------------------------#
  257.  
  258. function pipe_request_lsa_open_policy_step1(soc, uid, tid, pipe, name)
  259. {
  260.  
  261.  
  262.  tid_low = tid % 256;
  263.  tid_high = tid / 256;
  264.  
  265.  uid_low = uid % 256;
  266.  uid_high = uid / 256;
  267.  
  268.  pipe_low = pipe % 256;
  269.  pipe_high = pipe / 256;
  270.  
  271.  
  272.  uc= lsa_unicode(data:tolower(name));
  273.  tot_len = 132 + strlen(uc);
  274.  
  275.  data_count = 60 + strlen(uc);
  276.  data_count_low  = data_count % 256;
  277.  data_count_high = data_count / 256;
  278.  
  279.  
  280.  len = strlen(name) + 1;
  281.  
  282.  len_low = len % 256;
  283.  len_high = len / 256;
  284.  
  285.  total_data_count = 56 + strlen(uc); 
  286.  total_data_count_low = total_data_count % 256;
  287.  total_data_count_high = total_data_count / 256;
  288.  tot_len_low = tot_len % 256;
  289.  tot_len_high = tot_len / 256;
  290.  bcc = 65 + strlen(uc);
  291.  bcc_low = bcc % 256;
  292.  bcc_high = bcc / 256;
  293.  
  294.  x =  32 + strlen(uc);
  295.  x_low = x % 256;
  296.  x_high = x / 256;
  297.  
  298.  y= 138 + strlen(uc);
  299.  y_low = y % 256;
  300.  y_high = y / 256;
  301.  
  302.  h = raw_string(0x00, 0x00, 
  303.            tot_len_high, tot_len_low, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  304.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x26, 0x83,
  305.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  306.           0x00, 0x00, tid_low, tid_high,  0x00, 0x28, uid_low, uid_high,
  307.           g_mlo, g_mhi, 0x10, 0x00, total_data_count_high, total_data_count_low, 0x00, 0x00,
  308.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  309.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  310.           total_data_count_high, total_data_count_low, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  311.           0x00, pipe_low, pipe_high, bcc_low, bcc_high, 0x5C, 0x50, 0x49,
  312.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  313.           0x00, 0x03, 0x10, 0x00, 0x00, total_data_count_high, total_data_count_low, 0x00, 
  314.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, x_low, x_high,
  315.           0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, y_low, 0x48,
  316.           0x13, 0x00, len_low, len_high, 0x00, 0x00, 0x00, 0x00,
  317.           0x00, 0x00, len_low, len_high, 0x00, 0x00)
  318.           + uc + raw_string(
  319.           0xA4, 0xF2, 
  320.           0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 
  321.           0x01, 0x00, 0x00, 0x08, 0x00, 0x00);
  322.           
  323.  send(socket:soc, data:h);
  324.  r = smb_recv(socket:soc, length:4096);
  325.  if(strlen(r) < 10 )return(FALSE);
  326.  if(ord(r[9])==0)return(r);
  327.  else return(FALSE);
  328. }
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335. #-----------------------------------------------------------------------#
  336. # This function requests the name of the user of id <id>                #
  337. #-----------------------------------------------------------------------#
  338.  
  339.  
  340.  
  341.  
  342. function pipe_request_get_username(soc, uid, tid, pipe, name, reply,id, sid)                
  343. {
  344.  
  345.  
  346.  tid_low = tid % 256;
  347.  tid_high = tid / 256;
  348.  
  349.  uid_low = uid % 256;
  350.  uid_high = uid / 256;
  351.  
  352.  pipe_low = pipe % 256;
  353.  pipe_high = pipe / 256;
  354.  
  355.  id_low = id % 256;
  356.  id_high =  id / 256;
  357.  
  358.   
  359.   req = raw_string(0x00, 0x00,
  360.             0x00, 0xC4, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  361.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, ord(reply[16]),ord(reply[17]),
  362.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  363.           0x00, 0x00, tid_low, tid_high, 0x00, 0x00, uid_low, uid_high,
  364.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x6C, 0x00, 0x00,
  365.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  366.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  367.           0x00, 0x6C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  368.           0x00, pipe_low, pipe_high, 0x7D, 0x00, 0x00, 0x5C, 0x00,
  369.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  370.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
  371.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x6C, 0x00,
  372.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x00,
  373.           0x00, 0x00, 0x00, 0x00, 0x0F, 0x00);
  374.     
  375.   if(strlen(reply) < 104)return(FALSE);
  376.   magic = raw_string(ord(reply[84]));          
  377.   for(i=1;i<20;i=i+1)
  378.   {
  379.    magic = magic + raw_string(ord(reply[84+i]));
  380.   }
  381.   
  382.  
  383.   
  384.   req = req + magic + raw_string(0x01, 0x00, 0x00,0x00, 0xD8, 0xF2,
  385.           0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x3A,
  386.         0x13, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x05,
  387.         0x00, 0x00, 0x00, 0x00) + sid + raw_string( id_low, id_high,
  388.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  389.         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  390.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
  391.  
  392.   send(socket:soc, data:req);
  393.   r = smb_recv(socket:soc, length:65000);
  394.   length_answer = ord(r[2]);
  395.   length_answer = length_answer * 256;
  396.   
  397.   if(strlen(r) < 3)return(FALSE);
  398.   length_answer = length_answer + ord(r[3]);
  399.   
  400.   if(strlen(r) < length_answer+3)return(FALSE);
  401.   
  402.   v = ord(r[length_answer+3]);
  403.   if(v==192){
  404.       return(FALSE);
  405.       }
  406.   return(r);  
  407. }
  408.  
  409.  
  410. #--------------------------------------------------------------#
  411. #  main function to retrieve a username                        #
  412. #--------------------------------------------------------------#
  413. function get_name(soc, uid,tid, pipe, name, id, sid, hdl)
  414. {
  415.  
  416. #
  417. # Get the SID
  418. #
  419. r = pipe_request_get_username(soc:soc, uid:uid, tid:tid,
  420.                    pipe:pipe,name:name, reply:hdl, id:id, sid:sid);
  421.  
  422.  
  423. if(r)
  424.  {
  425.   if(strlen(r) > 125)
  426.   {
  427.   r = decode_username(s:r);
  428.   return(r);
  429.   }
  430.   else return(FALSE);
  431.  }
  432.  else return(FALSE);
  433. }
  434.  
  435.  
  436.  
  437. #==============================================================#
  438. # Section 3. Entry point of the plugin                         #
  439. #==============================================================#
  440.  
  441.  
  442.  
  443. __no_enum = string(get_kb_item("SMB/Users/0"));
  444. if(__no_enum)exit(0);
  445.  
  446. __no_enum = string(get_kb_item("SMB/Users/1"));
  447. if(__no_enum)exit(0);
  448.  
  449.  
  450. # we need the  netbios name of the host
  451. name = kb_smb_name();
  452. if(!name)exit(0);
  453.  
  454.  
  455. login = kb_smb_login();
  456. pass  = kb_smb_password();
  457. if(!login)login = "";
  458. if(!pass)pass = "";
  459.  
  460. domain = kb_smb_domain(); 
  461.  
  462.  
  463. # we need the SID of the domain
  464. sidx = get_kb_item("SMB/domain_sid_hex");
  465. if(!sidx)exit(0);
  466.  
  467. sid = hexsid_to_rawsid(s:sidx);
  468. soc = open_sock_tcp(port);
  469. if(!soc)exit(0);
  470.  
  471.  
  472. #
  473. # Request a new session
  474. r = smb_session_request(soc:soc,  remote:name);
  475. if(!r)exit(0);
  476.  
  477. #
  478. # Negociate the protocol
  479. #
  480. prot = smb_neg_prot(soc:soc);
  481. if(!prot)exit(0);
  482.  
  483. #
  484. # Set up our null session
  485. #
  486. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  487. if(!r)exit(0);
  488. # and extract our uid
  489. uid = session_extract_uid(reply:r);
  490.  
  491. #
  492. # Connect to the remote IPC and extract the TID
  493. # we are attributed
  494. #      
  495. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  496. # extract our tree id
  497. tid = tconx_extract_tid(reply:r);
  498.  
  499.  
  500. #
  501. # Create a pipe to lsarpc
  502. #
  503. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\lsarpc");
  504. if(!r)exit(0);
  505. # and extract its ID
  506. pipe = smbntcreatex_extract_pipe(reply:r);
  507.  
  508.  
  509. #
  510. # Setup things
  511. #
  512. r = pipe_request_lsa_open_policy_setup(soc:soc, uid:uid, tid:tid, pipe:pipe);
  513.  
  514.  
  515. num_users = 0;
  516. set_kb_item(name:"SMB/Users/enumerated", value:TRUE);
  517. report = string("The domain SID could be used to enumerate the names of the users\n",
  518.         "of this domain. \n",
  519.         "(we only enumerated users name whose ID is between ",
  520.         __start_uid," and ", __end_uid, "\n",
  521.         "for performance reasons)\n",
  522.         "This gives extra knowledge to an attacker, which\n",
  523.         "is not a good thing : \n");
  524.         
  525.  
  526.  
  527. #
  528. # Get the magic number
  529. #
  530. lsa = pipe_request_lsa_open_policy_step1(soc:soc, uid:uid, tid:tid, pipe:pipe,name:name);
  531. if(!lsa)exit(0);
  532.  
  533.         
  534. n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe, name:name, hdl:lsa, id:500, sid:sid);
  535. if(n)
  536.  {
  537.  num_users = num_users + 1;
  538.  report = report + string("- Administrator account name : ", n, " (id 500)\n");
  539.  set_kb_item(name:string("SMB/Users/", num_users), value:n);
  540.  set_kb_item(name:"SMB/AdminName", value:n);
  541.  }
  542.  
  543.  
  544.  
  545. n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe, name:name, id:501, hdl:lsa);
  546. if(n)
  547.  {
  548.   report = report + string("- Guest account name : ", n, " (id 501)\n");
  549.   num_users = num_users + 1;
  550.   set_kb_item(name:string("SMB/Users/", num_users), value:n);
  551.  }
  552.  
  553. #
  554. # Retrieve the name of the users between __start_uid and __start_uid
  555. #
  556. mycounter = __start_uid;
  557. while(1)
  558. {
  559.  n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe,hdl:lsa, name:name, id:mycounter);
  560.  if(n)
  561.  {
  562.   report = report + string("- ", n, " (id ", mycounter, ")\n");
  563.   num_users = num_users + 1;
  564.   set_kb_item(name:string("SMB/Users/", num_users), value:n);
  565.  }
  566.  else if(mycounter > __end_uid)break;
  567.  
  568.  if(mycounter > (5 * __end_uid))break;
  569.  
  570.  
  571.  mycounter++;
  572. }
  573.  
  574. close(soc);
  575. report = report + string(
  576.     "\nRisk factor : Medium\n",
  577.     "Solution : filter incoming connections this port\n");
  578.  
  579.     
  580. if(num_users > 0)
  581.  {
  582.  security_warning(data:report, port:port);
  583.  }
  584.